<?php

/**
 * Acceso de capa de datos para objetos de tipo Repertorio
 *
 * @author janunezc
 */
require_once('BE/BERepertorio.php');
require_once('BE/BERepertorio_Cancion.php');
require_once('DAL/DA_Canciones.php');

class DA_Repertorios {

    public static function moverCancion($repertorio_id, $cancion_id, $up_or_down) {
        DA_Repertorios::ArreglarOrdenDeRepertorio($repertorio_id);
        $repertorio = DA_Repertorios::ObtenerRepertorioDeID($repertorio_id);
        $idx = 0;
        foreach ($repertorio->canciones as $repertorio_cancion_actual) {
            $repertorio_cancion_anterior = $repertorio->canciones[$idx - 1];
            $repertorio_cancion_posterior = $repertorio->canciones[$idx + 1];

            if ($repertorio_cancion_actual->Cancion->cancion_id == $cancion_id) {
                if ($up_or_down == 'UP') {
                    //INTERCAMBIAR EL VALOR DE ORDEN CON CANCION ANTERIOR
                    if ($idx > 0) {
                        DA_Repertorios::ModificarOrdenDeCancionEnRepertorio(
                                        $repertorio_id,
                                        $repertorio_cancion_actual->Cancion->cancion_id,
                                        $repertorio_cancion_anterior->Orden);

                        DA_Repertorios::ModificarOrdenDeCancionEnRepertorio(
                                        $repertorio_id,
                                        $repertorio_cancion_anterior->Cancion->cancion_id,
                                        $repertorio_cancion_actual->Orden);
                    }
                } else {
                    //INTERCAMBIAR EL VALOR DE ORDEN CON CANCION POSTERIOR
                    $maxIdx = count($repertorio->canciones) - 1;
                    if ($idx < $maxIdx) {
                        DA_Repertorios::ModificarOrdenDeCancionEnRepertorio(
                                        $repertorio_id,
                                        $repertorio_cancion_actual->Cancion->cancion_id,
                                        $repertorio_cancion_posterior->Orden);

                        DA_Repertorios::ModificarOrdenDeCancionEnRepertorio(
                                        $repertorio_id,
                                        $repertorio_cancion_posterior->Cancion->cancion_id,
                                        $repertorio_cancion_actual->Orden);
                    }
                }
            }
            $idx++;
        }
    }

    public static function moverCancionPorIndice($repertorio_id, $cancion_id, $new_index, $from_index) {
        DA_Repertorios::ArreglarOrdenDeRepertorio($repertorio_id);
        $repertorio = DA_Repertorios::ObtenerRepertorioDeID($repertorio_id);
        //PRIMERA RUTINA: SACAR CANCION DE LA LISTA
        foreach ($repertorio->canciones as $repertorio_cancion_actual) {
            //echo "<br />" . $repertorio_cancion_actual->Cancion->titulo . " (" . $repertorio_cancion_actual->Orden . ")";
            if ($repertorio_cancion_actual->Cancion->cancion_id == $cancion_id) {
                //echo "Cancion Actual Encontrada";
                DA_Repertorios::ModificarOrdenDeCancionEnRepertorio(
                                $repertorio_id,
                                $repertorio_cancion_actual->Cancion->cancion_id,
                                $new_index);
            } else {

                //DETERMINE IF MOVE IS DOWNWARSDOR UPWARDS

                if ($new_index > $from_index) { //DOWNWARD LOGIC
                    if ($repertorio_cancion_actual->Orden <= $new_index) {
                        DA_Repertorios::ModificarOrdenDeCancionEnRepertorio(
                                        $repertorio_id,
                                        $repertorio_cancion_actual->Cancion->cancion_id,
                                        $repertorio_cancion_actual->Orden - 1);
                    } else {
                        DA_Repertorios::ModificarOrdenDeCancionEnRepertorio(
                                        $repertorio_id,
                                        $repertorio_cancion_actual->Cancion->cancion_id,
                                        $repertorio_cancion_actual->Orden + 1);
                    }
                } else { //UPWARD LOGIC
                    if ($repertorio_cancion_actual->Orden >= $new_index) {
                        // echo ("Agregando uno");
                        DA_Repertorios::ModificarOrdenDeCancionEnRepertorio(
                                        $repertorio_id,
                                        $repertorio_cancion_actual->Cancion->cancion_id,
                                        $repertorio_cancion_actual->Orden + 1);
                    }
                }
            }
        }

        DA_Repertorios::ArreglarOrdenDeRepertorio($repertorio_id);
    }

    public static function agregarCancion($repertorio_id, $cancion_id, $momento) {
        $orden = 0;
        $SQLCommand = "SELECT max(orden) as max_orden FROM repertorios_canciones WHERE repertorio_id = $repertorio_id";
        $result = DataAccessHelper::executeSQL($SQLCommand);
        if ($result) {
            while ($row = mysql_fetch_row($result)) {
                $orden = $row[0] + 1;
            }
        }

        $SQLCommand = "INSERT INTO repertorios_canciones (repertorio_id,momento,orden,cancion_id)
                       VALUES ($repertorio_id,'$momento',$orden,$cancion_id)";

        $result = DataAccessHelper::executeSQL($SQLCommand);
    }

    public static function quitarCancion($repertorio_id, $cancion_id) {
        $SQLCommand = "DELETE FROM repertorios_canciones
                       WHERE repertorio_id = $repertorio_id AND cancion_id = $cancion_id";

        $result = DataAccessHelper::executeSQL($SQLCommand);

        DA_Repertorios::ArreglarOrdenDeRepertorio($repertorio_id);
    }

    public static function obtenerContenidoHojaDeCantos($repertorio_id) {
        $contenido = "";
        $repertorio = DA_Repertorios::ObtenerRepertorioDeID($repertorio_id);
        $canciones = $repertorio->canciones;
        foreach ($canciones as $cancion_item) {
            $momento = $cancion_item->Momento;
            $cancion = $cancion_item->Cancion;
            $cancion_letra = DA_Canciones::obtenerSoloLetra($cancion->cancion_y_notas);

            $contenido .= "$momento\n$cancion_letra\n\n";
        }
        return $contenido;
    }

    public static function buscarRepertorio($qr) {
        if ($qr == '')
            return;
        //SEPARATE QUERY INTO WORDS
        $words = explode(" ", $qr);

        //BUILD WHERE CRITERIA
        $sqlCompare_titulo = "";
        $sqlCompare_cancion = "";
        $firstTime = true;
        foreach ($words as $word) {
            if ($firstTime) {
                $sqlCompare_titulo.="titulo like '%$word%'";
                $firstTime = false;
            } else {
                $sqlCompare_titulo.="AND titulo like '%$word%'";
            }
        }

        $firstTime = true;
        foreach ($words as $word) {
            if ($firstTime) {
                $sqlCompare_cancion.="fecha like '%$word%'";
                $firstTime = false;
            } else {
                $sqlCompare_cancion.="AND fecha like '%$word%'";
            }
        }

        //BUILD SQL COMMAND
        $SQLCommand = "  SELECT repertorio_id,titulo,fecha
                    FROM repertorios
                    WHERE ($sqlCompare_titulo) OR ($sqlCompare_cancion)
                    ORDER BY fecha desc, titulo
            ";

        $queryResult = DataAccessHelper::executeSQL($SQLCommand);
        $repertorios = null;
        if ($queryResult) {
            while ($row = mysql_fetch_row($queryResult)) {
                $repertorios[$row[0]] = "(" . $row[2] . ") " . $row[1];
            }
        }
        return $repertorios;
    }

    public static function CrearRepertorioBase($titulo, $fecha) {
        $SQLCommand = "INSERT INTO repertorios (titulo, fecha) VALUES ('$titulo','$fecha')";
        $result = DataAccessHelper::executeSQL($SQLCommand);
        $repertorio = DA_Repertorios::ObtenerRepertorioDeTituloYFecha($titulo, $fecha);
        return $repertorio;
    }

    public static function ObtenerRepertorioDeTituloYFecha($titulo, $fecha) {
        $repertorio = new BERepertorio();
        $SQLCommand = "SELECT repertorio_id, titulo, fecha FROM repertorios WHERE titulo = '$titulo' AND fecha = '$fecha'";
        $result = DataAccessHelper::executeSQL($SQLCommand);
        if ($result) {
            $row = mysql_fetch_row($result);
            $repertorio->repertorio_id = $row[0];
            $repertorio->titulo = $row[1];
            $repertorio->fecha = $row[2];
            $repertorio->canciones = DA_Repertorios::obtenerCancionesDeRepertorio($repertorio->repertorio_id);
        }

        return $repertorio;
    }

    public static function ObtenerRepertorioDeID($repertorio_id) {
        $repertorio = new BERepertorio();
        $SQLCommand = "SELECT repertorio_id, titulo, fecha FROM repertorios WHERE repertorio_id = $repertorio_id";
        $result = DataAccessHelper::executeSQL($SQLCommand);
        if ($result) {
            while ($row = mysql_fetch_row($result)) {
                $repertorio->repertorio_id = $row[0];
                $repertorio->titulo = $row[1];
                $repertorio->fecha = $row[2];
                $repertorio->canciones = DA_Repertorios::obtenerCancionesDeRepertorio($repertorio->repertorio_id);
            }
        }
        return $repertorio;
    }

    public static function obtenerCancionesDeRepertorio($repertorio_id) {
        $SQLCommand = "SELECT repertorio_id, momento, orden, cancion_id FROM repertorios_canciones WHERE repertorio_id = $repertorio_id ORDER BY orden";
        $result = DataAccessHelper::executeSQL($SQLCommand);
        if ($result) {
            while ($row = mysql_fetch_row($result)) {
                $repertorio_cancion = new BERepertorio_Cancion();
                $repertorio_cancion->Repertorio_id = $row[0];
                $repertorio_cancion->Momento = $row[1];
                $repertorio_cancion->Orden = $row[2];
                $repertorio_cancion->Cancion = DA_Canciones::obtenerCancion($row[3]);
                $canciones[] = $repertorio_cancion;
            }
        }
        return $canciones;
    }

    /**
     *
     * @param BERepertorio_Cancion $repertorioCancion
     */
    public static function ModificarOrdenDeCancionEnRepertorio($repertorio_id, $cancion_id, $orden) {
        $SQLCommand = " UPDATE repertorios_canciones
                        SET orden = $orden
                        WHERE repertorio_id = $repertorio_id
                              AND cancion_id = $cancion_id
                        ";

        DataAccessHelper::executeSQL($SQLCommand);
    }

    public static function ArreglarOrdenDeRepertorio($repertorio_id) {
        $repertorio = DA_Repertorios::ObtenerRepertorioDeID($repertorio_id);
        if (!$repertorio->canciones == false) {
            $idx = 0;
            foreach ($repertorio->canciones as $cancion_de_repertorio) {
                DA_Repertorios::ModificarOrdenDeCancionEnRepertorio($repertorio_id, $cancion_de_repertorio->Cancion->cancion_id, $idx);
                $idx++;
            }
        }
    }

    public static function EliminarRepertorio($repertorio_id) {
        $SQLCommand = " DELETE FROM repertorios_canciones
                        WHERE repertorio_id = $repertorio_id
                        ";

        DataAccessHelper::executeSQL($SQLCommand);

        $SQLCommand = " DELETE FROM repertorios
                        WHERE repertorio_id = $repertorio_id
                        ";

        DataAccessHelper::executeSQL($SQLCommand);
    }

}

?>
